#include <string.h>
#include "crowbar.h"

CRB_ErrorDefinition crb_compile_error_message_format[] = {
    {"dummy", NULL},
    {"文法エラー($(token)付近)", NULL},
    {"不正な文字($(bad_char))", NULL},
    {"関数名が重複しています($(name))", NULL},
    {"不正なマルチバイト文字です。", NULL},
    {"正規表現に改行が含まれています。", NULL},
    {"正規表現が作れません。$(message)", NULL},
    {"想定外のワイド文字列です。", NULL},
    {"配列の要素をfinalにはできません。", NULL},
    {"複合代入演算子をfinalに対しては適用できません。", NULL},
    {"dummy"}
};

CRB_ErrorDefinition crb_runtime_error_message_format[] = {
    {"dummy", NULL},
    {"変数または関数が見つかりません($(name))。",
     "VariableNotFoundException"},
    {"関数が要求する引数に対し、渡している引数が多すぎます。",
     "ArgumentTooManyException"},
    {"関数が要求する引数に対し、渡している引数が少なすぎます。",
     "ArgumentTooFewException"},
    {"条件式はboolean型でなければなりません。",
     "NotBooleanException"},
    {"マイナス演算子のオペランドは数値型でなければなりません。",
     "MinusOperandTypeException"},
    {"2項演算子$(operator)のオペランドの型が不正です。",
     "BadOperandTypeException"},
    {"&&, ||演算子のオペランドに実数型は使えません。",
     "LogicalOperatorDoubleOperandException"},
    {"&&, ||演算子のオペランドに整数型は使えません。",
     "LogicalOperatorIntegerOperandException"},
    {"$(operator)演算子はboolean型には使えません。",
     "NotBooleanOperatorException"},
    {"nullに対して適用できる演算は == と != だけです"
     "($(operator)はできません)。",
     "NotNullOperatorException"},
    {"オペランドが左辺値ではありません。",
     "NotLValueException"},
    {"添字演算子の左オペランドが配列ではありません。",
     "IndexOperandNotArrayException"},
    {"添字演算子の中が整数ではありません。",
     "IndexOperandNotIntException"},
    {"配列の範囲オーバーです。"
     "サイズ$(size)の配列の[$(index)]をアクセスしています。",
     "ArrayIndexOutOfBoundsException"},
    {"対象のオブジェクトには$(method_name)というメソッドはありません。",
     "NoSuchMethodException"},
    {"インクリメント/デクリメントの対象が整数ではありません。",
     "IncDecOperandTypeException"},
    {"インクリメント/デクリメントの対象が存在しません。",
     "IncDecOperandNotExistException"},
    {"関数呼び出しの対象が関数ではありません。",
     "NotFunctionException"},
    {"オブジェクト以外のメンバは更新できません。",
     "NotObjectMemberUpdateException"},
    {"オブジェクト以外のメンバには代入はできません。",
     "NotObjectMemberAssignException"},
    {"そのオブジェクトにはメンバ$(member_name)はありません。",
     "NoSuchMemberException"},
    {"そのデータ型にはメンバは今のところありません。",
     "NoMemberTypeException"},
    {"文字列に対し演算子$(operator)は適用できません。",
     "BadOperatorForStringException"},
    {"ゼロで除算はできません。",
     "DivisionByZeroException"},
    {"グローバル変数$(name)は存在しません。",
     "GlobalVariableNotFoundException"},
    {"global文は関数外では使えません。",
     "GlobalStatementInToplevelException"},
    {"$(name)という名前の関数が既に存在します。",
     "FunctionExistsException"},
    {"配列のresize()の引数は整数型でなければなりません"
     "($(type)が渡されています)。",
     "ArrayResizeArgumentException"},
    {"配列のinsert()の第1引数は整数型でなければなりません"
     "($(type)が渡されています)。",
     "ArrayInsertArgumentException"},
    {"配列のremove()の引数は整数型でなければなりません"
     "($(type)が渡されています)。",
     "ArrayRemoveArgumentException"},
    {"文字列中の位置指定が範囲外です。"
     "長さ$(len)の文字列に対し$(pos)を指定しています。",
     "StringPositionOutOfBoundsException"},
    {"文字列のsubstr()の第2引数(切り出す文字列長)が範囲外($(len))です。",
     "StringSubstrLengthException"},
    {"文字列のsubstr()の引数は整数型でなければなりません"
     "($(type1)と$(type2)が渡されています)。",
     "StringSubstrArgumentException"},
    {"例外にmessageメンバがありません。",
     "ExceptionHasNoMessageException"},
    {"例外のmessageメンバが文字列ではありません($(type)が渡されています)。",
     "ExceptionMessageIsNotStringException"},
    {"例外にstack_traceメンバがありません。",
     "ExceptionHasNoStackTraceException"},
    {"例外のスタックトレースが配列型ではありません。",
     "StackTraceIsNotArrayException"},
    {"例外のスタックトレースの要素がオブジェクトではありません。",
     "StackTraceLineIsNotAssocException"},
    {"スタックトレースの行に行番号が含まれません。",
     "StackTraceLineHasNoLineNumberException"},
    {"スタックトレースの行に関数名が含まれません。",
     "StackTraceLineHasNoFuncNameException"},
    {"オブジェクト以外の例外がトップレベルまで伝播しました。",
     "ExceptionIsNotAssocException"},
    {"例外にprint_stack_traceメンバがありません。",
     "ExceptionHasNoPrintStackTraceMethodException"},
    {"例外のprint_stack_traceメンバがクロージャではありません。",
     "PrintStackTraceIsNotClosureException"},
    {"不正なマルチバイト文字です。",
     "BadMultibyteCharacterException"},
    {"例外クラスがオブジェクトではありません($(type)です)。",
     "ExceptionClassIsNotAssocException"},
    {"例外クラスにcreate methodがありません。",
     "ExceptionClassHasNoCreateMethodException"},
    {"関数$(func_name)に渡している$(idx)番目の引数の型が違います。"
     "$(type)が渡されています。",
     "ArgumentTypeMismatchException"},
    {"想定外のワイド文字列です。",
     "UnexpectedWideStringException"},
    {"正規表現による検索に失敗しました。$(message)",
     "OnigSearchFailException"},
    {"正規表現のグループ番号が大きすぎます。",
     "GroupIndexOverflowException"},
    {"指定されたグループ番号(\\$(g_idx))に対応するグループはありません。",
     "GroupIndexOverflowException"},
    {"breakまたはcontinueまたはreturnがトップレベルまで伝播しました。",
     "BreakOrContinueReachedToplevelException"},
    {"変数またはメンバ$(name)はfinalです。",
     "AssignToFinalVariableException"},
    {"関数が見つかりません($(name))。",
     "FunctionNotFoundException"},
    {"dummy", NULL}
};

CRB_ErrorDefinition crb_native_error_message_format[] = {
    {"fopen()関数にはファイルのパスとモード(どちらも文字列型)を"
     "渡してください。",
     "FOpenArgumentTypeException"},
    {"fclose()関数にはファイルポインタを渡してください。",
     "FCloseArgumentTypeException"},
    {"fgets()関数にはファイルポインタを渡してください。",
     "FGetsArgumentTypeException"},
    {"そのファイルは既にクローズされています。",
     "FileAlreadyClosedException"},
    {"fputs()関数にはファイルポインタと文字列を渡してください。",
     "FPutsArgumentTypeException"},
    {"new_array()関数には整数型(配列サイズ)を渡してください。",
     "NewArrayArgumentTypeException"},
    {"new_array()関数には、配列のサイズを次元の数だけ渡してください。",
     "NewArrayArgumentTooFewException"},
    {"exit()の引数は整数型でなければなりません"
     "($(type)が渡されています)。",
     "ExitArgumentTypeException"},
    {"new_exception()の引数はメッセージ文字列です"
     "($(type)が渡されています)。",
     "NewExceptionArgumentException"},
    {"不正なマルチバイト文字列です。",
     "FGetsBadMultibyteCharacterException"},
};
